// 1. 内置类型演示
void builtInTypesDemo() {
  print("\n=== 内置类型演示 ===");

  // 数值类型
  int integer = 42;
  double decimal = 3.14;
  num number = 100; // 通用数值类型

  print("整数: $integer");
  print("浮点数: $decimal");
  print("数值运算: ${integer * decimal}");

  // 字符串类型
  String name = "Alice";
  String message = "Hello, ${name}!";
  String rawString = r"换行符示例 \n"; // 原始字符串

  print("字符串: $message");
  print("原始字符串: $rawString");

  // 布尔类型
  bool isReady = true;
  bool hasError = false;

  print("布尔值: isReady = $isReady, hasError = $hasError");

  // 列表 (List)
  List<String> fruits = ["apple", "banana", "cherry"];
  fruits.add("date");
  print("列表: ${fruits.join(", ")}");

  // 集合 (Set)
  Set<int> numbers = {1, 2, 2, 3}; // 自动去重
  numbers.add(4);
  print("集合: ${numbers.toList()}");

  // 映射 (Map)
  Map<String, int> scores = {"Bob": 90, "Alice": 85};
  scores["Charlie"] = 80;
  print("映射: ${scores.entries.join(", ")}");
}

// 2. 记录类型演示 (Dart 2.17+)
void recordsDemo() {
  print("\n=== 记录类型演示 ===");

  // 创建记录
  var point = (x: 10, y: 20);
  print("记录: ${point}");

  // 解构记录 - 修复：使用命名参数解构
  var (x: x, y: y) = point;
  print("解构坐标: x = $x, y = $y");

  // 记录作为函数返回值
  (String, int) getUser() => ("John", 30);
  var (name, age) = getUser();
  print("用户信息: $name, $age 岁");
}

// 3. 集合操作演示
void collectionsDemo() {
  print("\n=== 集合操作演示 ===");

  // 列表操作
  List<int> list = [1, 2, 3];
  list.removeAt(1);
  print("列表移除元素后: ${list}");
  print("列表是否为空: ${list.isEmpty}");

  // 集合运算
  Set<int> setA = {1, 2, 3};
  Set<int> setB = {3, 4, 5};
  print("并集: ${setA.union(setB)}");
  print("交集: ${setA.intersection(setB)}");

  // 映射遍历
  Map<String, String> planets = {"Mercury": "closest", "Venus": "hottest"};
  planets.forEach((key, value) => print("$key: $value"));
}

// 4. 泛型演示 - 修复：将 Pair 类移到函数外部
class Pair<T extends Comparable<T>> {
  final T first, second;
  Pair(this.first, this.second);
  bool isOrdered() => first.compareTo(second) < 0;
}

class Stack<T> {
  final List<T> _items = [];

  void push(T item) => _items.add(item);
  T pop() => _items.removeLast();
}

void genericsDemo() {
  print("\n=== 泛型演示 ===");

  // 泛型类使用
  var stringStack = Stack<String>();
  stringStack.push("A");
  stringStack.push("B");
  print("弹出元素: ${stringStack.pop()}");

  // 泛型函数
  int identity<T>(T value) => value as int;
  print("泛型函数结果: ${identity(42)}");

  // 类型参数约束
  var pair = Pair(10, 20);
  print("是否有序: ${pair.isOrdered()}");
}

// 5. 类型定义演示
typedef CompareFunction = int Function(int a, int b);
typedef StringList = List<String>;

void typedefsDemo() {
  print("\n=== 类型定义演示 ===");

  // 函数类型别名
  CompareFunction compare = (a, b) => a - b;
  print("比较结果: ${compare(5, 3)}");

  // 集合类型别名
  StringList names = ["Alice", "Bob"];
  names.add("Charlie");
  print("类型定义列表: ${names}");
}

// 6. 类型系统演示
void typeSystemDemo() {
  print("\n=== 类型系统演示 ===");

  dynamic obj = "Hello";

  // 类型检查
  if (obj is String) {
    print("是字符串类型");
  }

  // 类型转换
  String str = obj as String;
  print("转换后字符串: ${str.length}");

  // 断言 - 修复：将 x 初始化为非空值
  int? x = 5; // 初始化为非空值以避免断言错误
  assert(x != null, "x 不能为 null");
}

void main() {
  builtInTypesDemo();
  recordsDemo();
  collectionsDemo();
  genericsDemo();
  typedefsDemo();
  typeSystemDemo();
}
